Volatile在一般的多线程编程里面算是比较尴尬的关键字,在java里面叫做程度较轻的 synchronized
,不过一般在一些多线程的文章里面几乎不提到Volatile或者不建议使用这个关键字,毕竟这个关键字非常不好控制,干脆不用为好,我的看法是大多是时候么搞不清楚就不要用,(当然越不用就越生疏,呵呵),但是话说回来我对这个关键字实现高性能读写锁还是比较感兴趣的
可见性,但不互斥.怎么理解这句话,首先可见性的原因是以为,这个关键字可以让变量不缓存在寄存器里面,每次取值都是直接从主存里面获取,所以每次都是最新的值.但是不互斥是因为没有锁,这里有个改变值的流程(读取-修改-写入),这是一个比读更耗时的一个操作,在没有加锁的情况下别的线程读取这个值可能是任何一个时刻的值;所以根据这个特性可以推导出使用Volatile在少写多读的情况下,性能非常好,当然首先要保证不会是多线程同时写.
Volatile有五个使用场景(参考Brian Goetz ([email protected])的文章):
- 作为状态标志
- 一次性安全发布
- 独立观察
- volatile bean模式
- 开销较低的读写锁策略
具体内容可以拜读一下]原文
其中第五个还是值得推广应用一下的,其他的几种模式使用起来我个人觉得还是需要保持谨慎的,毕竟自己的代码还能保证变量不互斥,一旦是团队合作的话就很难保证了,因为你不可能跟团队的内一个人说这个是volatile的.
虽然基础,但是免得自己忘记了,记录一下.